package com.olc.railing.busniess;

import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.media.SoundPool;
import android.os.Build;
import android.speech.tts.TextToSpeech;
import android.util.Log;

import com.olc.railing.utils.MyLog;

import java.util.Locale;

public class PlayMediaBusiness {
    private static PlayMediaBusiness instance;
    protected AudioTrack m_out_trk;
    protected int m_out_buf_size;
    protected byte[] m_out_bytes;
    private SoundPool mSoundPool;
    private TextToSpeech tts;

    public PlayMediaBusiness() {
        init();
    }

    //方法同步，调用效率低
    public static synchronized PlayMediaBusiness getInstance( ) {
        if (instance == null) {
            instance = new PlayMediaBusiness();
        }
        return instance;
    }

    public void init() {
    /*    try {
            m_out_buf_size = AudioTrack.getMinBufferSize(8000,
                    AudioFormat.CHANNEL_OUT_MONO,
                    AudioFormat.ENCODING_PCM_16BIT);

            m_out_trk = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
                    AudioFormat.CHANNEL_OUT_MONO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    m_out_buf_size,
                    AudioTrack.MODE_STREAM);
            m_out_bytes = new byte[m_out_buf_size];
        } catch (Exception e) {
            e.printStackTrace();
        }*/
        //sdk版本21是SoundPool 的一个分水岭
        if (Build.VERSION.SDK_INT >= 21) {
            SoundPool.Builder builder = new SoundPool.Builder();
            //传入最多播放音频数量,
            builder.setMaxStreams(1);
            //AudioAttributes是一个封装音频各种属性的方法
            AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
            //设置音频流的合适的属性
            attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
            //加载一个AudioAttributes
            builder.setAudioAttributes(attrBuilder.build());
            mSoundPool = builder.build();
        } else {
            /**
             * 第一个参数：int maxStreams：SoundPool对象的最大并发流数
             * 第二个参数：int streamType：AudioManager中描述的音频流类型
             *第三个参数：int srcQuality：采样率转换器的质量。 目前没有效果。 使用0作为默认值。
             */
            mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        }

    }
/*
    *//**
     * 播放字节流
     * @param
     *//*
    public void play( byte[] bytes_pkg) {
        m_out_trk.play();
        try {
           int len =   m_out_trk.write(bytes_pkg, 0, bytes_pkg.length);
            MyLog.d(MyLog.TAG, "play  len ="+len);
        } catch (Exception e) {
            MyLog.d(MyLog.TAG, "Exception   ="+e.toString());
            e.printStackTrace();
        }
    }
    public void stop(){
        if(m_out_trk!=null){
            m_out_trk.stop();
        }

    }*/

    public void play(Context context, int resId) {
        Log.d("PlayMediaBusiness","resId = "+resId);
        if(mSoundPool==null){
            init();
        }
        //可以通过四种途径来记载一个音频资源：
        //context：上下文
        //resId：资源id
        // priority：没什么用的一个参数，建议设置为1，保持和未来的兼容性
        //path：文件路径
        // FileDescriptor：貌似是流吧，这个我也不知道
        //：从asset目录读取某个资源文件，用法：
        // AssetFileDescriptor descriptor = assetManager.openFd("biaobiao.mp3")；

        //1.通过一个AssetFileDescriptor对象
        //int load(AssetFileDescriptor afd, int priority)
        //2.通过一个资源ID
        //int load(Context context, int resId, int priority)
        //3.通过指定的路径加载
        //int load(String path, int priority)
        //4.通过FileDescriptor加载
        //int load(FileDescriptor fd, long offset, long length, int priority)
        //声音ID 加载音频资源,这里用的是第二种，第三个参数为priority，声音的优先级*API中指出，priority参数目前没有效果，建议设置为1。
        final int voiceId = mSoundPool.load(context, resId, 1);
        //异步需要等待加载完成，音频才能播放成功
        mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                if (status == 0) {
                    //第一个参数soundID
                    //第二个参数leftVolume为左侧音量值（范围= 0.0到1.0）
                    //第三个参数rightVolume为右的音量值（范围= 0.0到1.0）
                    //第四个参数priority 为流的优先级，值越大优先级高，影响当同时播放数量超出了最大支持数时SoundPool对该流的处理
                    //第五个参数loop 为音频重复播放次数，0为值播放一次，-1为无限循环，其他值为播放loop+1次
                    //第六个参数 rate为播放的速率，范围0.5-2.0(0.5为一半速率，1.0为正常速率，2.0为两倍速率)
                    soundPool.play(voiceId, 1, 1, 1, 0, 1);
                }
            }
        });
    }


}
